﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 交错数组  //可以理解为数组的数组，数组里面存的是数组
{
    class Program
    {
        
        static void Main(string[] args)
        {
            
            //// 交错数组的定义
            //int[][] a = new int[3][];
            //// 第一排
            //a[0] = new int[] { 1, 2, 3, 4 };
            //// 第二排
            //a[1] = new int[] { 1, 2, 3 };
            //// 3排
            //a[2] = new int[] { 8, 7, 6, 5, 4, 3, 2, 1, 0};

            //// 交错数组的长度表示的是里面有多少个数组
            //Console.WriteLine("长度是{0}", a.Length);
            //Console.WriteLine("第一行的长度是{0}", a[0].Length);
            //Console.WriteLine("第二行的长度是{0}", a[1].Length);


            M(7);
        }

        /// <summary>
        /// 打印杨辉三角
        /// </summary>
        /// <param name="n">打印多少行</param>
        static void M(int n)
        {
            int[][] a = new int[n][];

            for (int i = 0; i < a.Length; i++)
            {
                // 给每一行分配列
                a[i] = new int[i + 1];
                // 给每一行的第一个元素赋值
                a[i][0] = 1;
                // 给每一行的最后一个元素赋值
                a[i][i] = 1;

                // 从第3行开始去算中间的元素
                if (i > 1)
                {
                    // 因为第一列恒等于1，我们已经能够赋值过了，所以我们从第二列开始，所以刚开始的时候j = 1，而不是等于0
                    for (int j = 1; j < i; j++)
                    {// 每一行有i + 1个元素，但是最后一个元素恒等于1，所以不需要我们计算，所以j只需要小于i就可以了，而不是小于i + 1
                        a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
                    }
                }
            }

            //读取交错数组中的元素
            for (int i = 0; i < a.Length; i++)
            {
                for (int j = 0; j < a.Length - i; j++)
                {
                    Console.Write(" ");
                }
                for (int k = 0; k < a[i].Length; k++)
                {
                    Console.Write("{0} ", a[i][k]);
                }
                Console.WriteLine();
            }
        }
    }
}
